package com.bjpowernode.javase.exception;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/*
处理异常的第一种方式：
    在方法声明的地方使用throws关键字抛出，谁调用这个方法就抛给谁。
    这种处理异常的态度：上报。
处理异常的第二种方式：
    使用try..catch语句对异常进行捕捉。
    这个异常不会上报，自己把这个事处理了。
    异常处理到这不在上报了。

注意：只要异常没有捕捉，采用上报的方式，异常后续代码不会执行。
    try语句块中的某一行出现异常，该行后面的代码不会执行。
    try..catch捕捉异常后，后续代码可以执行。


 */
public class ExceptionTest06 {
    //一般不建议在main方法中使用throws，因为这个异常一旦发生了一定会抛给JVM，JVM只有终止
    //异常处理机制的作用是增强程序的健壮性，怎么能做到，异常发生了也不会影响程序的执行，
    //一般方法是在main方法中使用try..catch捕捉异常。main方法就不会上抛了。

    public static void main(String[] args) {
        System.out.println("main begin");

        try{
            //try尝试
            m1();
            //以上代码出现异常，直接进入catch分支。
            System.out.println("Hello World");
        }catch(FileNotFoundException e){//catch后面好像是一个方法的形参
            //这个分支中可以使用e引用，e引用保存的内存地址是哪个new出来异常对象的内存地址。
            //catch是捕捉到异常后走的分支，然后在catch中处理异常
            System.out.println("文件不存在，可能路径错误。");
            System.out.println(e);
        }

        //try..catch 把异常抓住之后，这里的代码会继续执行。
        System.out.println("main over");
    }

    public static  void m1() throws  FileNotFoundException{
        System.out.println("m1 begin");
        m2();
        System.out.println("m1 over");
    }

    //public static void m2() throws ClassCastException{//抛出别的异常不行
   //抛出FileNotFoundException父类是IOException没有问题
    //直接抛出Exception也没有问题
    //throws后面可以抛出多个异常。
    public static void m2() throws FileNotFoundException {
        System.out.println("m2 begin");
        //编译报错的原因为：m3()方法声明位置上有throws FileNotFoundException
        //我们这里调用m3()没有对异常进行处理，所以编译报错。
        m3();

        //以上代码中出现异常，以下代码是无法执行的！
        System.out.println("m2 over");
    }

    public static  void m3() throws FileNotFoundException {
        //调用孙JDK中某个类的构造方法
        //这个类还没有学过，后期IO流就知道了
        //我们只是借助这个类学习一下异常处理机制
        //创建一个输入流对象，该流指向一个文件路径。
        /*
        编译报错的原因：
        1、这里调用了一个构造方法
        2、这个构造方法的声明的位置上有：throws FileNotFoundException
        3、通过类的构造方法发现：FileNotFoundException父类是IOException，IOException的父类是Exception
        最终得知FileInputStream是编译时异常。

        得出错误原因：编译时异常要求程序员在编译阶段必须对其进行处理，不处理就会报错。
         */
        //我们采用第一种处理方式：在方法声明的位置上使用throws继续上抛。
         new FileInputStream("E:\\postgraduate\\ana_start\\Java\\IDEA\\练习.txt");
        System.out.println("以上代码出异常这里就不会执行。");
    }


}
